package webService;

import controller.ControllerRicercaLocal;
import eccezioni.CampoErratoException;
import entity.Annuncio;
import entity.UtenteRegistrato;
import java.util.List;
import javax.ejb.EJB;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.ejb.Stateless;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
import utilities.AnnuncioConDistanza;

/**
 * Metodi per svolgere la ricerca di un annuncio
 * @author Ale
 */
@WebService(serviceName = "CercaAnnuncioWS")
@Stateless()
public class CercaAnnuncioWS {
    @EJB
    private ControllerRicercaLocal ejbRef;

    /**
     * Esegue una ricerca tra gli annunci coi parametri specificati, che sono tutti opzionali
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @param url sito a cui si riferisce la ricerca
     * @param vicinoA indirizzo in base a cui sono ordinati i risultati
     * @return la lista di annunci corrispondenti
     * @throws CampoErratoException se ci sono dei parametri di ricerca non nel formato corretto
     */
    @WebMethod(operationName = "cerca")
    public List<AnnuncioConDistanza> cerca(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato, @WebParam(name = "url") String url, @WebParam(name = "vicinoA") String vicinoA) throws CampoErratoException {
        return ejbRef.cerca(utenteLoggato, url, vicinoA);
    }

    /**
     * Esegue una ricerca tra gli annunci aperti coi parametri specificati, che sono tutti opzionali
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @param sito sito a cui si riferisce la ricerca
     * @param vicinoA indirizzo in base a cui sono ordinati i risultati
     * @return la lista di annunci aperti corrispondenti
     */
    @WebMethod(operationName = "vicinoA")
    public List<AnnuncioConDistanza> cercaAperti(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato, @WebParam(name = "sito") String sito, @WebParam(name = "vicinoA") String vicinoA) {
        return ejbRef.cercaAperti(utenteLoggato, sito, vicinoA);
    }

    /**
     * Esegue una ricerca tra gli annunci coi parametri specificati, che sono tutti opzionali
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @param sito sito a cui si riferisce la ricerca
     * @param dataChiusura data massima di chiusura degli annunci cercati
     * @param dataOrdine data massima di ordine degli annunci cercati
     * @param vicinoA indirizzo in base a cui sono ordinati i risultati
     * @param chiusi true sse si vogliono includere anche gli annunci chiusi
     * @return la lista di annunci corrispondenti
     * @throws CampoErratoException se ci sono dei parametri di ricerca non nel formato corretto
     */
    @WebMethod(operationName = "cerca_1")
    @RequestWrapper(className = "cerca_1")
    @ResponseWrapper(className = "cerca_1Response")
    public List<AnnuncioConDistanza> cerca(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato, @WebParam(name = "sito") String sito, @WebParam(name = "dataChiusura") String dataChiusura, @WebParam(name = "dataOrdine") String dataOrdine, @WebParam(name = "vicinoA") String vicinoA, @WebParam(name = "chiusi") boolean chiusi) throws CampoErratoException {
        return ejbRef.cerca(utenteLoggato, sito, dataChiusura, dataOrdine, vicinoA, chiusi);
    }

    /**
     * Esegue una ricerca tra gli annunci coi parametri specificati, che sono tutti opzionali
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @param sito sito a cui si riferisce la ricerca
     * @param dataChiusura data massima di chiusura degli annunci cercati
     * @param dataOrdine data massima di ordine degli annunci cercati
     * @param vicinoA indirizzo in base a cui sono ordinati i risultati
     * @param chiusi true sse si vogliono includere anche gli annunci chiusi
     * @param minFeed feedback minimo che deve avere il creatore di un annuncio per restituirlo
     * @return la lista di annunci corrispondenti
     * @throws CampoErratoException se ci sono dei parametri di ricerca non nel formato corretto
     */
    @WebMethod(operationName = "cerca_2")
    @RequestWrapper(className = "cerca_2")
    @ResponseWrapper(className = "cerca_2Response")
    public List<AnnuncioConDistanza> cerca(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato, @WebParam(name = "sito") String sito, @WebParam(name = "dataChiusura") String dataChiusura, @WebParam(name = "dataOrdine") String dataOrdine, @WebParam(name = "vicinoA") String vicinoA, @WebParam(name = "chiusi") boolean chiusi, @WebParam(name = "minFeed") int minFeed) throws CampoErratoException {
        return ejbRef.cerca(utenteLoggato, sito, dataChiusura, dataOrdine, vicinoA, chiusi, minFeed);
    }

    /**
     * Esegue una ricerca tra gli annunci coi parametri specificati, che sono tutti opzionali
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @param sito sito a cui si riferisce la ricerca
     * @param dataChiusura data massima di chiusura degli annunci cercati
     * @param dataOrdine data massima di ordine degli annunci cercati
     * @param vicinoA indirizzo in base a cui sono ordinati i risultati
     * @param chiusi true sse si vogliono includere anche gli annunci chiusi
     * @param nomeCr nome del creatore degli annunci cercati
     * @param cognomeCr cognome del creatore degli annunci cercati
     * @return la lista di annunci corrispondenti
     * @throws CampoErratoException se ci sono dei parametri di ricerca non nel formato corretto
     */
    @WebMethod(operationName = "cerca_3")
    @RequestWrapper(className = "cerca_3")
    @ResponseWrapper(className = "cerca_3Response")
    public List<AnnuncioConDistanza> cerca(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato, @WebParam(name = "sito") String sito, @WebParam(name = "dataChiusura") String dataChiusura, @WebParam(name = "dataOrdine") String dataOrdine, @WebParam(name = "vicinoA") String vicinoA, @WebParam(name = "chiusi") boolean chiusi, @WebParam(name = "nomeCr") String nomeCr, @WebParam(name = "cognomeCr") String cognomeCr) throws CampoErratoException {
        return ejbRef.cerca(utenteLoggato, sito, dataChiusura, dataOrdine, vicinoA, chiusi, nomeCr, cognomeCr);
    }

    /**
     * Resistuisce la lista di annunci aperti presenti per una certa regione
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @param regione la regione per cui si cercano gli annunci
     * @return la lista di annunci aperti presenti per la regione specificata
     */
    @WebMethod(operationName = "trovaInRegione")
    public List<Annuncio> trovaInRegione(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato, @WebParam(name = "regione") String regione) {
        return ejbRef.trovaInRegione(utenteLoggato, regione);
    }

    /**
     * Recupera la lista di annunci in scadenza, cioè ancora aperti, ordinati per scadenza
     * @param utenteLoggato l'utente a cui mostrare gli annunci, null se è un guest
     * @return la lista di annunci in scadenza
     */
    @WebMethod(operationName = "trovaInScadenza")
    public List<Annuncio> trovaInScadenza(@WebParam(name = "utenteLoggato") UtenteRegistrato utenteLoggato) {
        return ejbRef.trovaInScadenza(utenteLoggato);
    }
    
}
